{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 逻辑回归示例\n",
    "- 逻辑回归\n",
    "- 加正则化项的逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.optimize import minimize\n",
    "from sklearn.preprocessing.data import PolynomialFeatures\n",
    "\n",
    "pd.set_option('display.notebook_repr_html',False)\n",
    "pd.set_option('display.max_columns',None)\n",
    "pd.set_option('display.max_rows',150)\n",
    "pd.set_option('display.max_seq_items', None)\n",
    "\n",
    "import seaborn as sns\n",
    "sns.set_context('notebook')\n",
    "sns.set_style('white')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def loaddata(file, delimeter):\n",
    "    data = np.loadtxt(file, delimiter=delimeter)\n",
    "    print('Dimensions:',data.shape)\n",
    "    print(data[1:6,:])\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plotData(data, label_x, label_y, label_pos, label_neg, axes=None):\n",
    "    # 获得正负样本的下标（即哪些是正样本，哪些是负样本）\n",
    "    neg = data[:,2] == 0 # 负样本\n",
    "    pos = data[:,2] == 1 # 正样本\n",
    "    \n",
    "    if axes is None:\n",
    "        axes = plt.gca()\n",
    "    \n",
    "    axes.scatter(data[pos][:,0], data[pos][:,1], marker='+', c='k', \n",
    "                 s=60, linewidths=2, label=label_pos)\n",
    "    axes.scatter(data[neg][:,0], data[neg][:,1], c='y', \n",
    "                 s=60, label=label_neg)\n",
    "    axes.set_xlabel(label_x)\n",
    "    axes.set_ylabel(label_y)\n",
    "    axes.legend(frameon=True, fancybox=True)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dimensions: (100, 3)\n[[ 30.28671077  43.89499752   0.        ]\n [ 35.84740877  72.90219803   0.        ]\n [ 60.18259939  86.3085521    1.        ]\n [ 79.03273605  75.34437644   1.        ]\n [ 45.08327748  56.31637178   0.        ]]\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "file_1 = os.path.join(os.getcwd(), \n",
    "                              '02_第1章_课程讲解案例_Linear-models',\n",
    "                              'logistic_regression',\n",
    "                              'data1.txt')\n",
    "data = loaddata(file_1, ',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.c_[np.ones((data.shape[0],1)), data[:,0:2]]\n",
    "y = np.c_[data[:,2]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10a7a3860>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Pass', 'Fail')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 逻辑回归假设"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ h_0(x) = g({\\theta}^t x) $$  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ g(z) = \\frac{1}{1 + e^{-z}}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义sigmoid函数\n",
    "def sigmoid(z):\n",
    "    return 1/(1 + np.exp(-z))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 损失函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ -\\frac{1}{m}[\\sum\\limits_{i=1}^my^{(i)}log(h_{\\theta}(x^{(i)})) + (1-y^{(i)})log(h_{1 - \\theta}(x))]$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 向量化的损失函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big)$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义损失函数\n",
    "def costFunction(theta, X, y):\n",
    "    m = y.size\n",
    "    h = sigmoid(X.dot(theta))\n",
    "    \n",
    "    J = -1.0 * (1.0 / m) * (np.log(h).T.dot(y) + np.log(1-h).T.dot(1-y))\n",
    "    \n",
    "    if np.isnan(J[0]):\n",
    "        return (np.inf)\n",
    "    return J[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 求偏导（梯度）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 向量化的偏导（梯度）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 向量化的偏导（梯度）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 考试1得分45，考试2得分85的同学通过率有多高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 求解梯度(就1次？？！)\n",
    "def gradient(theta, X, y):\n",
    "    m = y.size\n",
    "    h = sigmoid(X.dot(theta.reshape(-1,1)))\n",
    "    \n",
    "    grad = (1.0/m)*X.T.dot(h-y)\n",
    "    return grad.flatten() # 矩阵变向量"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cost: \n 0.69314718056\nGrad: \n [ -0.1        -12.00921659 -11.26284221]\n"
     ]
    }
   ],
   "source": [
    "# 特征有多少个，θ就有多少维。注意这个X是已经添加了常数项X0\n",
    "initial_theta = np.zeros(X.shape[1])    \n",
    "cost = costFunction(initial_theta, X, y)\n",
    "grad = gradient(initial_theta, X, y)\n",
    "print('Cost: \\n',cost)\n",
    "print('Grad: \\n', grad)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 最小化损失函数  \n",
    "spicy包有把一个函数最小化的方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/seamonster/MachineLearningEngineerEnv/lib/python3.6/site-packages/ipykernel_launcher.py:6: RuntimeWarning: divide by zero encountered in log\n  \n/usr/local/seamonster/MachineLearningEngineerEnv/lib/python3.6/site-packages/ipykernel_launcher.py:6: RuntimeWarning: divide by zero encountered in log\n  \n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "      fun: 0.20349770158950986\n hess_inv: array([[  2.85339493e+03,  -2.32908823e+01,  -2.27416470e+01],\n       [ -2.32908823e+01,   2.04489131e-01,   1.72969525e-01],\n       [ -2.27416470e+01,   1.72969525e-01,   1.96170322e-01]])\n      jac: array([ -2.68557626e-09,   4.36433482e-07,  -1.39671758e-06])\n  message: 'Optimization terminated successfully.'\n     nfev: 34\n      nit: 25\n     njev: 30\n   status: 0\n  success: True\n        x: array([-25.16131634,   0.2062316 ,   0.20147143])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res = minimize(costFunction, initial_theta, args=(X, y), jac=gradient, options={'maxiter':400})\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 做一下预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(theta, X, threshold=0.5):\n",
    "    p = sigmoid(X.dot(theta.T)) >= threshold\n",
    "    return p.astype('int')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 考试1得分45，考试2得分85的同学通过率有多高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.77629032493310179"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sigmoid(np.array([1, 45, 85]).dot(res.x.T))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.contour.QuadContourSet at 0x10a8d16d8>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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69at7Nmzh+HDhzNixAh27NgBQIMGDdixYwd///13mdssiue7mU5S0lhSU6fRrt2mgF94SrqonnRS66B9dlGcMCTTubOZN2jduhpXXvkBb799PdnZ/85NnTiRLjvaBYgtPQKl1MnAN0APIBNYAOQAW4DRWuvgpqMU1isopjfgj02bNpGSksKff/7JU089xaxZs1i+fHnu8fj4eK655hoGDRrEzp07GTFiBO+//36ebKc6derQp08fsrKyGOVJrq5VqxYjR46kV69erF+/nvHjx/PGG28AJhhs2LDBWz9EBIEVi99KuqjWrn2Z5QvwnFL5NC4ORo6cRWrqM0yZMp+PPhrGuHEjSUn5HpAV/IFieY9AKRUDzAWOeh6aBtytte4MuID+ljTEt1dQzt4AmPmBmjVr8v777/P3338zcuRI5s2bx7Jly3jzzTdJSUmhX79+uFwuUlJSqFq1Knv37s19/Zo1a/jzzz9ZuXIln3zyCR999BHffvstzZo1y73Qt23blj///BNvocBatWqxf3/xm7xEIm/2zc8/j2XXrmmOv2N04h4WRe0zbUddqGPH0khO/oEZMzrTo8cL3HrrJzz33CSOH4/LPS7Kx46hoSnAHCDd830bYLXn6+VAd0ta4e0VQLl7AwA1atTg4MGDXH755bz55pssXryYkSNH0rdvXwYMGMDrr7/OI488AsCePXs4fPgwtWrVyn19lSpViI+PJzY2lri4OCpVqsTBgweZNWsWCxcuBMzwUp06dXKHjQ4cOECNGjXK1e5w45TN3kvDSRddX1YNjZXE22OKisqhf/85zJ/fkl9+ac61125i8+bOIZM55OQbFEuHhpRSVwJ7tdYrlFLeW3CX1tq7dvcQYF0C/u23w6pV5e4NALRo0YIpU6YUeXzgwIHccccdDB06FJfLxeTJk4mOjmbevHmcdtppdOnShS+++ILBgwcTFRVF69at6dixI82bN2f8+PGsXr0at9udZ3L4hx9+YPz48eVue7gI5VWoTi3G54S6UPmHqWrVSueBBwbw6acX8tBDr7JlS00ef9xMMjuV00uGWD1HcDWQo5TqDrQEFgG+m5xWAqwb62jSxBRKL2dvACAhIYFmzZrx/fffc7pnrfyAAQNyj8fGxjJ16tQCr0tNTSUmxqxevummm7jpppvyHK9SpQrz5s0r8Lqff/6ZRo0a5aajCmet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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10a8d1dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(45, 85, s=60, c='r', marker='v', label='(45,85)')\n",
    "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Admitted', 'Not admitted')\n",
    "x1_min, x1_max = X[:,1].min(), X[:,1].max()\n",
    "x2_min, x2_max = X[:,2].min(), X[:,2].max()\n",
    "# meshgrid什么鬼？\n",
    "xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n",
    "# ravel是什么鬼\n",
    "h = sigmoid(np.c_[np.ones((xx1.ravel().shape[0], 1)), xx1.ravel(), xx2.ravel()].dot(res.x))\n",
    "h = h.reshape(xx1.shape)\n",
    "\n",
    "plt.contour(xx1, xx2, h, [0.5], linewidths=1, colors='b')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 加正则化项的逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dimensions: (118, 3)\n[[-0.092742  0.68494   1.      ]\n [-0.21371   0.69225   1.      ]\n [-0.375     0.50219   1.      ]\n [-0.51325   0.46564   1.      ]\n [-0.52477   0.2098    1.      ]]\n"
     ]
    }
   ],
   "source": [
    "file_2 = os.path.join(os.getcwd(), \n",
    "                              '02_第1章_课程讲解案例_Linear-models',\n",
    "                              'logistic_regression',\n",
    "                              'data2.txt')\n",
    "data2 = loaddata(file_2,',')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拿到X和y\n",
    "y = np.c_[data2[:,2]]\n",
    "X = data2[:,0:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ab0db00>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画个图\n",
    "plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y=1','y=0')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 整一点多项式特征出来（最高6阶）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(118, 28)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "poly = PolynomialFeatures(6)\n",
    "XX = poly.fit_transform(data2[:,0:2])\n",
    "# 看看形状（特征映射后有多少维）\n",
    "XX.shape    # 28维"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化后损失函数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big] + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 向量化的损失函数（矩阵形式）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big) + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义损失函数\n",
    "def costFUnctionReg(theta, reg, *args):\n",
    "    m = y.size\n",
    "    h = sigmoid(XX.dot(theta))\n",
    "    \n",
    "    J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y)) \\\n",
    "        + (reg/(2.0*m))*np.sum(np.square(theta[1:]))\n",
    "    \n",
    "    if np.isnan(J[0]):\n",
    "        return np.inf\n",
    "    return J[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 偏导(梯度)\n",
    "\n",
    "### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} + \\frac{\\lambda}{m}\\theta_{j}$$ \n",
    "### 向量化的偏导(梯度)\n",
    "### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y) + \\frac{\\lambda}{m}\\theta_{j}$$\n",
    "#### $$\\text{注意，我们另外自己加的参数 } \\theta_{0} \\text{ 不需要被正则化}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradientReg(theta, reg, *args):\n",
    "    m = y.size\n",
    "    h = sigmoid(XX.dot(theta.reshape(-1,1)))\n",
    "    \n",
    "    grad = (1.0/m)*XX.T.dot(h-y) + (reg/m)*np.r_[[[0]],theta[1:].reshape(-1,1)]\n",
    "    \n",
    "    return grad.flatten()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.69314718055994529"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "initial_theta = np.zeros(XX.shape[1])\n",
    "costFUnctionReg(initial_theta, 1, XX, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/seamonster/MachineLearningEngineerEnv/lib/python3.6/site-packages/ipykernel_launcher.py:3: RuntimeWarning: overflow encountered in exp\n  This is separate from the ipykernel package so we can avoid doing imports until\n/usr/local/seamonster/MachineLearningEngineerEnv/lib/python3.6/site-packages/matplotlib/contour.py:967: UserWarning: The following kwargs were not used by contour: 'linewidth'\n  s)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ac55cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(1,3, sharey=True, figsize=(17,5))\n",
    "\n",
    "# 决策边界，分别来看看正则化系数lambda太大太小分别会出现什么情况\n",
    "# lambda = 0: 就是没有正则化，这样的话，就过拟合\n",
    "# lambda = 1：这才是正确的打开方式\n",
    "# lambda = 100： 正则化项太激进，导致基本就没拟合出决策边界\n",
    "\n",
    "for i, C in enumerate([0.0, 1.0, 100.0]):\n",
    "    # 最优化 costFunctionReg\n",
    "    res2 = minimize(costFUnctionReg, initial_theta, args=(C, XX, y), jac=gradientReg, \n",
    "                    options={'maxiter':3000})\n",
    "    \n",
    "    # 准确率\n",
    "    accuracy = 100.0 * sum(predict(res2.x, XX) == y.ravel()) / y.size\n",
    "    \n",
    "    # 对X，y的散列绘图\n",
    "    plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0', \n",
    "             axes.flatten()[i])\n",
    "    \n",
    "    # 画出决策边界\n",
    "    x1_min, x1_max = X[:,0].min(), X[:,0].max()\n",
    "    x2_min, x2_max = X[:,1].min(), X[:,1].max()\n",
    "    xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n",
    "    h = sigmoid(poly.fit_transform(np.c_[xx1.ravel(), xx2.ravel()]).dot(res2.x))\n",
    "    h = h.reshape(xx1.shape)\n",
    "    axes.flatten()[i].contour(xx1, xx2, h, [0.5], linewidth=1, colors='g')\n",
    "    axes.flatten()[i].set_title(\n",
    "        'Train accuracy {}% with Lambda = {}'.format(np.round(accuracy, decimals=2), C))\n",
    "        \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
